"""
时区工具模块
统一管理系统时区，确保所有时间字段使用上海时区
"""

from datetime import datetime, timezone, timedelta
from typing import Optional

# 创建上海时区
SHANGHAI_TZ = timezone(timedelta(hours=8))

def get_shanghai_now() -> datetime:
    """
    获取上海时区的当前时间
    
    Returns:
        datetime: 当前上海时间（无时区信息，因为数据库会话已设置时区）
    """
    return datetime.now(SHANGHAI_TZ).replace(tzinfo=None)

def convert_to_shanghai(dt: Optional[datetime]) -> Optional[datetime]:
    """
    将UTC时间转换为上海时间
    
    Args:
        dt: UTC时间
        
    Returns:
        datetime: 上海时间，如果输入为None则返回None
    """
    if dt is None:
        return None
    
    if dt.tzinfo is None:
        # 假设无时区信息的时间是UTC时间
        dt = dt.replace(tzinfo=timezone.utc)
    
    # 转换为上海时区
    shanghai_dt = dt.astimezone(SHANGHAI_TZ)
    
    # 移除时区信息，因为数据库会话已设置时区
    return shanghai_dt.replace(tzinfo=None)

def format_shanghai_time(dt: Optional[datetime], format_str: str = "%Y-%m-%d %H:%M:%S") -> str:
    """
    格式化上海时间为字符串
    
    Args:
        dt: 时间对象
        format_str: 格式字符串
        
    Returns:
        str: 格式化后的时间字符串
    """
    if dt is None:
        return ""
    
    # 如果是UTC时间，先转换为上海时间
    if dt.tzinfo is not None:
        dt = convert_to_shanghai(dt)
    
    return dt.strftime(format_str)

def get_shanghai_timestamp() -> int:
    """
    获取上海时区的时间戳（秒）
    
    Returns:
        int: 时间戳
    """
    return int(get_shanghai_now().timestamp())

def get_shanghai_timestamp_ms() -> int:
    """
    获取上海时区的时间戳（毫秒）
    
    Returns:
        int: 时间戳（毫秒）
    """
    return int(get_shanghai_now().timestamp() * 1000)

# 为了向后兼容，提供一个别名
utcnow = get_shanghai_now
